#include "AppDirectory.h"

// 定义静态成员变量
std::string AppDirectory::s_executable_path;

void AppDirectory::InitializeAppPath(const char* argv0) {
    try {
        s_executable_path = std::filesystem::canonical(argv0).string();
    } catch (const std::filesystem::filesystem_error& e) {
        // 如果解析失败，回退到当前工作目录
        s_executable_path = std::filesystem::current_path().string();
    }
}

std::string AppDirectory::GetAppDirectory() {
    #ifdef _WIN32
    // 预分配足够大的缓冲区来存储文件路径
    char buffer[MAX_PATH];

    // 获取当前模块（可执行文件）的完整路径
    DWORD length = GetModuleFileNameA(NULL, buffer, MAX_PATH);

    if (length == 0) {
        // 如果获取失败，返回空字符串
        return "";
    }

    // 转换为 std::string
    std::string fullPath(buffer);

    // 使用 C++17 的 std::filesystem 获取目录部分
    std::filesystem::path path(fullPath);
    std::filesystem::path directory = path.parent_path();  // 获取目录部分

    return directory.string();  // 返回目录字符串
    #else
    std::filesystem::path executable_path;

    if (!s_executable_path.empty()) {
        executable_path = std::filesystem::path(s_executable_path);
    } else {
        // 如果未初始化，回退到当前工作目录
        executable_path = std::filesystem::current_path();
    }

    // 获取目录部分
    std::filesystem::path directory = executable_path.parent_path();
    return directory.string();
    #endif
}

// int main(int argc, char* argv[])
// {
//     AppDirectory::InitializeAppPath(argv[0]);
//     std::string path = AppDirectory::GetAppDirectory();

//     return 0;
// }